﻿using System;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using System.Net.NetworkInformation;
using System.IO;

namespace NetworkInterfaceManager
{
    public partial class MainForm : Form
    {
        private string logFilePath = "net_app.log";

        // 构造函数，在窗体加载前初始化组件，并记录软件启动事件。
        public MainForm()
        {
            InitializeComponent();
            LogEvent("软件已启动");
        }

        // 窗体关闭时触发的事件处理程序，用于记录软件关闭事件。
        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            base.OnFormClosing(e);
            LogEvent("软件已关闭");
        }

        // 窗体加载事件处理程序，调用 PopulateNetworkInterfaces 方法填充网络接口列表。
        private void MainForm_Load(object sender, EventArgs e)
        {
            PopulateNetworkInterfaces();
        }

        // 填充 DataGridView 控件中的网络接口信息。
        private void PopulateNetworkInterfaces()
        {
            try
            {
                statusLabel.Text = "正在刷新...";
                Application.DoEvents(); // 强制刷新UI线程

                dataGridViewInterfaces.Rows.Clear();
                int seq = 1;
                foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
                {
                    string adminStatus = ni.IsReceiveOnly ? "只读" : "可配置";
                    string operationalStatus = GetOperationalStatusDescription(ni.OperationalStatus);
                    string speed = $"{ni.Speed / 1000000.0:N2} Mbps";

                    // 添加网络接口信息到 DataGridView 中
                    dataGridViewInterfaces.Rows.Add(seq++, ni.Name, adminStatus, operationalStatus, ni.GetType().Name, speed, ni.NetworkInterfaceType);
                }

                statusLabel.Text = "刷新完成";
                LogEvent("网络接口列表刷新完成"); // 记录刷新完成事件
            }
            catch (Exception ex)
            {
                statusLabel.Text = "刷新失败";
                LogError($"刷新网络接口列表时出错: {ex.Message}"); // 记录刷新失败错误
            }
        }

        // 刷新按钮点击事件处理程序，重新填充网络接口列表。
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            PopulateNetworkInterfaces();
        }

        // 重启按钮点击事件处理程序，重启选中的网络接口。
        private void btnRestart_Click(object sender, EventArgs e)
        {
            if (dataGridViewInterfaces.SelectedRows.Count == 0)
            {
                MessageBox.Show("请先选择一个网络接口。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            var selectedRow = dataGridViewInterfaces.SelectedRows[0];
            string interfaceName = selectedRow.Cells["colName"].Value?.ToString();

            if (interfaceName != null)
            {
                try
                {
                    statusLabel.Text = $"正在重启 {interfaceName}...";
                    Application.DoEvents(); // 强制刷新UI线程

                    RestartInterface(interfaceName);

                    statusLabel.Text = $"{interfaceName} 已成功重启";
                    LogEvent($"{interfaceName} 已成功重启"); // 记录重启成功的事件
                }
                catch (Exception ex)
                {
                    statusLabel.Text = "重启失败";
                    LogError($"重启网络接口 {interfaceName} 时出错: {ex.Message}"); // 记录重启失败错误
                }
            }
        }

        // 执行禁用并重新启用网络接口的操作。
        private void RestartInterface(string interfaceName)
        {
            ExecuteCommand($"netsh interface set interface name=\"{interfaceName}\" admin=DISABLED");
            Thread.Sleep(2000); // 等待一段时间让禁用生效
            ExecuteCommand($"netsh interface set interface name=\"{interfaceName}\" admin=ENABLED");
        }

        // 执行命令行命令。
        private void ExecuteCommand(string command)
        {
            using (Process process = new Process())
            {
                ProcessStartInfo startInfo = new ProcessStartInfo
                {
                    WindowStyle = ProcessWindowStyle.Hidden,
                    FileName = "cmd.exe",
                    Arguments = $"/C {command}",
                    RedirectStandardOutput = true,
                    UseShellExecute = false,
                    CreateNoWindow = true
                };
                process.StartInfo = startInfo;
                process.Start();
                process.WaitForExit();
            }
        }

        // 将错误信息写入日志文件，格式为：时间戳 - 错误 - 消息内容。
        private void LogError(string message)
        {
            WriteLogEntry("错误", message);
        }

        // 将事件信息写入日志文件，格式为：时间戳 - 事件 - 消息内容。
        private void LogEvent(string message)
        {
            WriteLogEntry("[info]", message);
        }

        // 写入日志条目，根据类型（事件或错误）格式化日志信息。
        private void WriteLogEntry(string level, string message)
        {
            using (var writer = new StreamWriter(logFilePath, true))
            {
                // 格式化日志条目为指定格式
                string logEntry = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} {level} - {message}";
                writer.WriteLine(logEntry);
            }
        }

        // 查看日志按钮点击事件处理程序，尝试使用记事本打开日志文件。
        private void btnLog_Click(object sender, EventArgs e)
        {
            try
            {
                Process.Start("notepad.exe", logFilePath);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"无法打开日志文件: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 将 OperationalStatus 枚举值转换为中文简短描述。
        /// </summary>
        /// <param name="status">要转换的 OperationalStatus 枚举值。</param>
        /// <returns>对应的中文简短描述。</returns>
        static string GetOperationalStatusDescription(OperationalStatus status)
        {
            switch (status)
            {
                case OperationalStatus.Up:
                    return "正常运行";
                case OperationalStatus.Down:
                    return "不可用";
                case OperationalStatus.Testing:
                    return "测试中";
                case OperationalStatus.Unknown:
                    return "未知状态";
                case OperationalStatus.Dormant:
                    return "非活动";
                case OperationalStatus.NotPresent:
                    return "未检测到";
                case OperationalStatus.LowerLayerDown:
                    return "下层故障";
                default:
                    return "未知";
            }
        }

        // DataGridView 单元格点击事件处理程序，可以在此处添加更多逻辑。
        private void dataGridViewInterfaces_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
    }
}